﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using EvaluacionExalmarOledbHelper;
using EvaluacionExalmarEntidades;
using EvaluacionExalmarInterfaces;
using System.Configuration;
using System.Text;

namespace EvaluacionExalmarAccesoDatos
{
    public class Empleado : IEmpleado
    {
        #region IEmpleado Members

        private readonly String _sCadenaConexion = ConfigurationManager.ConnectionStrings["con"].ConnectionString;

        public EmpleadoInfo Consultar(EmpleadoInfo oEmpleado)
        {
            var query = new StringBuilder(
                @"Select Nombre, Apellido_Paterno, Apellido_Materno, Id_Cargo, Cargo, Id_Gerencia, Gerencia, Id_Area, Area, " +
                "IdEmpleado, Etapa_Contribucion, Dni From ConsultaEmpleados");

            if (oEmpleado != null)
            {
                var where = new StringBuilder(" where ");
                if (!String.IsNullOrEmpty(oEmpleado.Nombres))
                    where.Append(" Nombre Like '%" + oEmpleado.Nombres + "%' ");
                if (!String.IsNullOrEmpty(oEmpleado.ApellidoPaterno))
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append("Apellido_Paterno Like '%" + oEmpleado.ApellidoPaterno + "%'");
                }
                if (!String.IsNullOrEmpty(oEmpleado.ApellidoMaterno))
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Apellido_Materno Like '%" + oEmpleado.ApellidoMaterno + "%'");
                }
                if (!String.IsNullOrEmpty(oEmpleado.Dni))
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Dni = '" + oEmpleado.Dni + "'");
                }
                if (oEmpleado.IdCargo.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id_Cargo = " + oEmpleado.IdCargo);
                }
                if (oEmpleado.IdArea.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id_Area = " + oEmpleado.IdArea);
                }
                if (oEmpleado.IdEmpleado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" IdEmpleado = " + oEmpleado.IdEmpleado);
                }


                query.Append(@where);
            }
            var oEntEmpleado = new EmpleadoInfo();

            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();
                        oEntEmpleado = new EmpleadoInfo(drd.GetInt32(9), drd.IsDBNull(0) ? "" : drd.GetString(0).Trim(),
                            drd.IsDBNull(1) ? "" : drd.GetString(1).Trim(), drd.IsDBNull(2) ? "" : drd.GetString(2).Trim(),
                            Int32.Parse(drd.GetValue(5).ToString()), new GerenciaInfo(Int32.Parse(drd.GetValue(5).ToString()), drd.GetString(6).Trim()),
                            Int32.Parse(drd.GetValue(7).ToString()), new AreaInfo(Int32.Parse(drd.GetValue(7).ToString()), drd.GetString(8).Trim(), Int32.Parse(drd.GetValue(5).ToString()), null),
                            Int32.Parse(drd.GetValue(3).ToString()), new CargoInfo(Int32.Parse(drd.GetValue(3).ToString()), drd.GetString(4).Trim()),
                            Int32.Parse(drd.GetValue(10).ToString()), drd.GetString(11).Trim());
                    }
                }
            }
            return oEntEmpleado;
        }

        public IList<EmpleadoInfo> Listar(EmpleadoInfo oEmpleado)
        {
            var query = new StringBuilder(
                @"Select Nombre, Apellido_Paterno, Apellido_Materno, Id_Cargo, Cargo, Id_Gerencia, Gerencia, Id_Area, Area, " +
                "IdEmpleado, Etapa_Contribucion, Dni From ConsultaEmpleados");

            if (oEmpleado != null)
            {
                var where = new StringBuilder(" where ");
                if (!String.IsNullOrEmpty(oEmpleado.Nombres))
                    where.Append(" Nombre Like '%" + oEmpleado.Nombres + "%' ");
                if (!String.IsNullOrEmpty(oEmpleado.ApellidoPaterno))
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append("Apellido_Paterno Like '%" + oEmpleado.ApellidoPaterno + "%'");
                }
                if (!String.IsNullOrEmpty(oEmpleado.ApellidoMaterno))
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Apellido_Materno Like '%" + oEmpleado.ApellidoMaterno + "%'");
                }
                if (!String.IsNullOrEmpty(oEmpleado.Dni))
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Dni = '" + oEmpleado.Dni + "'");
                }
                if (oEmpleado.IdCargo.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id_Cargo = " + oEmpleado.IdCargo.ToString());
                }
                if (oEmpleado.IdArea.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append(" Id_Area = " + oEmpleado.IdArea.ToString());
                }


                query.Append(@where);
            }
            var oListaEmpleados = new List<EmpleadoInfo>();

            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaEmpleados.Add(new EmpleadoInfo(drd.GetInt32(9), drd.IsDBNull(0) ? "" : drd.GetString(0).Trim(),
                                drd.IsDBNull(1) ? "" : drd.GetString(1).Trim(), drd.IsDBNull(2) ? "" : drd.GetString(2).Trim(),
                                Int32.Parse(drd.GetValue(5).ToString()), new GerenciaInfo(Int32.Parse(drd.GetValue(5).ToString()), drd.GetString(6).Trim()),
                                Int32.Parse(drd.GetValue(7).ToString()), new AreaInfo(Int32.Parse(drd.GetValue(7).ToString()), drd.GetString(8).Trim(), Int32.Parse(drd.GetValue(5).ToString()), null),
                                Int32.Parse(drd.GetValue(3).ToString()), new CargoInfo(Int32.Parse(drd.GetValue(3).ToString()), drd.GetString(4).Trim()),
                                Int32.Parse(drd.GetValue(10).ToString()), drd.GetString(11).Trim()));
                        }
                    }
                }
            }
            return oListaEmpleados;
        }

        public bool Registrar(EmpleadoInfo oEmpleado)
        {
            var bExito = false;

            const string query = "Insert into Empleado (Nombre, Apellido_Paterno, Apellido_Materno, Id_Cargo, Id_Area, " +
                                 "Dni, Etapa_Contribucion) Values (?, ?, ?, ?, ?, ?, ?)";

            var oledbParm = new OleDbParameter[7];

            using (var oledbcon = new OleDbConnection(_sCadenaConexion))
            {
                oledbcon.Open();
                var oledbtran = oledbcon.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    oledbParm[0] = new OleDbParameter("@Nombre", OleDbType.VarChar) { Value = oEmpleado.Nombres };
                    oledbParm[1] = new OleDbParameter("@Apellido_Paterno", OleDbType.VarChar)
                    {
                        Value = oEmpleado.ApellidoPaterno
                    };
                    oledbParm[2] = new OleDbParameter("@Apellido_Materno", OleDbType.VarChar)
                    {
                        Value = oEmpleado.ApellidoMaterno
                    };
                    oledbParm[3] = new OleDbParameter("@Id_Cargo", OleDbType.Integer) { Value = oEmpleado.IdCargo };
                    oledbParm[4] = new OleDbParameter("@Id_Area", OleDbType.Integer) { Value = oEmpleado.IdArea };
                    oledbParm[5] = new OleDbParameter("@Dni", OleDbType.VarChar) { Value = oEmpleado.Dni };
                    oledbParm[6] = new OleDbParameter("@Etapa_Contribucion", OleDbType.Integer) { Value = oEmpleado.EtapaContribucion };


                    OleDbHelper.ExecuteNonQuery(oledbtran, CommandType.Text, query, oledbParm);
                    bExito = true;
                    oledbtran.Commit();
                }
                catch
                {
                    oledbtran.Rollback();
                    bExito = false;
                }
                finally
                {
                    oledbcon.Close();
                }
            }


            return bExito;
        }

        public bool Actualizar(EmpleadoInfo oEmpleado)
        {
            bool bExito;

            const string query = "Update Empleado " +
                                 " Set Nombre = ?, Apellido_Paterno = ?, Apellido_Materno = ?, Id_Cargo = ?, Id_Area = ?, " +
                                 "Dni = ?, Etapa_Contribucion = ? Where Id = ?";

            var oledbParm = new OleDbParameter[8];

            using (var oledbcon = new OleDbConnection(_sCadenaConexion))
            {
                oledbcon.Open();
                var oledbtran = oledbcon.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    oledbParm[0] = new OleDbParameter("@Nombre", OleDbType.VarChar) { Value = oEmpleado.Nombres };
                    oledbParm[1] = new OleDbParameter("@Apellido_Paterno", OleDbType.VarChar) { Value = oEmpleado.ApellidoPaterno };
                    oledbParm[2] = new OleDbParameter("@Apellido_Materno", OleDbType.VarChar) { Value = oEmpleado.ApellidoMaterno };
                    oledbParm[3] = new OleDbParameter("@Id_Cargo", OleDbType.Integer) { Value = oEmpleado.IdCargo };
                    oledbParm[4] = new OleDbParameter("@Id_Area", OleDbType.Integer) { Value = oEmpleado.IdArea };
                    oledbParm[5] = new OleDbParameter("@Dni", OleDbType.VarChar) { Value = oEmpleado.Dni };
                    oledbParm[6] = new OleDbParameter("@Etapa_Contribucion", OleDbType.Integer) { Value = oEmpleado.EtapaContribucion };

                    oledbParm[7] = new OleDbParameter("@Id", OleDbType.Integer) { Value = oEmpleado.IdEmpleado };

                    OleDbHelper.ExecuteNonQuery(oledbtran, CommandType.Text, query, oledbParm);
                    bExito = true;
                    oledbtran.Commit();
                }
                catch
                {
                    oledbtran.Rollback();
                    bExito = false;
                }
                finally
                {
                    oledbcon.Close();
                }
            }


            return bExito;
        }

        #endregion
    }
}
